package com.bit.cfdi.web.services;

import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.stereotype.Service;

import com.bit.cfdi.web.dao.SerieDAO;
import com.bit.cfdi.web.domain.Negocio;
import com.bit.cfdi.web.domain.Serie;
import com.bit.cfdi.web.domain.Sucursal;
@Service
public class SerieService {
	
	@Autowired private SerieDAO serieDAO;
	
	public void save(final Serie serie) throws DataAccessException {
		serieDAO.save(serie);
	}

	public void delete(final Serie serie) throws DataAccessException {
		serieDAO.delete(serie);
	}

	public void incrementFolio(final Serie serie) throws DataAccessException {/*
		log.info("incrementaFolio called");
		log.info("serie: "+serie.getSerie()+" rfc: "+serie.getRFC() + 
				" asignado a: "+serie.getSucursal().getNombre()+
				" tipo de comprobante: "+ serie.getTipoDeComprobante());*/
		long folioNumber = 0L;
		try {
			folioNumber = Long.parseLong(serie.getNoFolioActual());
		} catch(NumberFormatException nfe) {
			//log.error("NumberFormatException");
			nfe.printStackTrace();
			return;
		}
		//log.info("Folio actual: "+folioNumber);
		folioNumber++;
		serie.setNoFolioActual(String.valueOf(folioNumber));
		serieDAO.save(serie);
		//log.info("Folio aumentado: "+folioNumber);
	}

	public List<Serie> getAll() throws DataAccessException {
		return serieDAO.getAll();
	}

	public List<Serie> getBySucursalRFC(final Sucursal sucursal, 
			final String RFC) throws DataAccessException {
		return serieDAO.getBySucursalRFC(sucursal, RFC);
	}

	public List<Serie> getByRFCSerieFolios(final String RFC, 
			final String serieString, final String noFolioInicial, 
			final String noFolioFinal) throws DataAccessException {
		long folioInicialSerie = Long.valueOf(noFolioInicial);
		long folioFinalSerie = Long.valueOf(noFolioFinal);
		List<Serie> toReturn = new ArrayList<Serie>();
		List<Serie> listOfSeries = getBySucursalRFC(null, RFC);
		for(Serie tempSerie : listOfSeries) {
			if(tempSerie.getSerie().equals(serieString)) {
				long folioInicial = Long.valueOf(tempSerie.getNoFolioInicial());
				long folioFinal = Long.valueOf(tempSerie.getNoFolioFinal());
				if(folioInicialSerie>=folioInicial && 
						folioInicialSerie<=folioFinal) {
					toReturn.add(tempSerie);
					continue;
				}
				if(folioFinalSerie>=folioInicial 
						&& folioFinalSerie<=folioFinal) {
					toReturn.add(tempSerie);
					continue;
				}
			}
		}
		return toReturn;
	}

	public List<Serie> getAprobacionByNegocioYSerie(
			Negocio negocio, String serie) throws DataAccessException {
		return serieDAO.getAprobacionByNegocioYSerie(negocio, serie);
	}

	public Serie getBySucursalNegocioRFCSerie(final Sucursal sucursal,
			final String RFC, final String serie) throws DataAccessException {
		return serieDAO.getBySucursalNegocioRFCSerie(sucursal, RFC, serie);
	}

}
